﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace tablica
{
    public partial class Macierz : Form
    {
        Wspolrzedne wspolrzedne;
        Odwzorowanie odwzorowanie;

        public Macierz()
        {
            InitializeComponent();
            wspolrzedne = new Wspolrzedne();
            odwzorowanie = new Odwzorowanie();
            okresleniePierwszegoPunktuStartowego();
            okresleniePierwszegoPunktuKoncowego();
                        
        }

        private void okresleniePierwszegoPunktuStartowego()
        {
            wspolrzedne.wspolrzednePunktuStartowego = new int[3];
            wspolrzedne.wspolrzednePunktuStartowego[0] = -1;
            wspolrzedne.wspolrzednePunktuStartowego[1] = -1;
            wspolrzedne.wspolrzednePunktuStartowego[2] = -1;
        }

        private void okresleniePierwszegoPunktuKoncowego()
        {
            wspolrzedne.wspolrzednePunktuKoncowego = new int[3];
            wspolrzedne.wspolrzednePunktuKoncowego[0] = -1;
            wspolrzedne.wspolrzednePunktuKoncowego[1] = -1;
            wspolrzedne.wspolrzednePunktuKoncowego[2] = -1;
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void btnZatwierdz_Click(object sender, EventArgs e)
        {
            string rozmiarSceny = tbRozmiarSceny.Text;
            double.TryParse(rozmiarSceny, out wspolrzedne.jakaDuzaScena);
            string narzedzie = tbNarzedzie.Text;
            double.TryParse(narzedzie, out wspolrzedne.jakDuzeNarzedzie);
            RysujSiatke();
        }

        private void RysujSiatke()
        {
            UstawSkale();
            WypelnijTablice();
            SkalaNaOsiX();
        }

        private void WypelnijTablice()
        {
            wspolrzedne.ileKolumn = Siatka.Height / wspolrzedne.jakDuzeNarzedzie;
            for (int i = 0; i <= (int)wspolrzedne.ileKolumn; i++)
            {
                if (wspolrzedne.jakDuzeNarzedzie < 1 || wspolrzedne.ileKolumn > 80)
                {
                    MessageBox.Show("Zbyt male narzedzie lub zbyt gesta siatka.\n Podaj jeszcze raz dane wejsciowe");
                    //Dispose();
                    break;
                }

                else
                {
                    Siatka.Columns.Add("", "");
                    Siatka.Columns[i].Width = (int)wspolrzedne.jakDuzeNarzedzie;
                    Siatka.Rows.Add();
                    Siatka.Rows[i].Height = (int)wspolrzedne.jakDuzeNarzedzie;
                }
            }

            utworzMacierzOdwzorowania();
        }

        // Oblicza kolejne wartosci oraz wypisuje je na osi X. Zmienia widzialnosc etykiet.   
        private void SkalaNaOsiX()
        {
            double krok = wspolrzedne.jakaDuzaScena / 5;
            lbOsX6.Text = wspolrzedne.jakaDuzaScena.ToString();
            lbOsX2.Text = krok.ToString();
            lbOsX3.Text = (krok*2).ToString();
            lbOsX4.Text = (krok*3).ToString();
            lbOsX5.Text = (krok*4).ToString();

            lbOsX1.Visible = true;
            lbOsX2.Visible = true;
            lbOsX3.Visible = true;
            lbOsX4.Visible = true;
            lbOsX5.Visible = true;
            lbOsX6.Visible = true;
        }

        /* Metoda odpowiedzialna za skalowanie siatki. Z uwagi na konieczność ustalenia parametrow komponentu DataGridView.Height and Width wynik musi zostac
         * zaokraglony do wartosci calkowitej. Wysokosc pola datagirdview dzielona jest przez rozmiar narzedzia wprowadzony przez uzytkownika. Powstala w ten
         * sposob skala sluzy do wyznaczenia rozmiaru narzedzia w skali (przedstawionego na ekranie). Metoda Round sluzy do zaokraglenia w gore wyniku.
         */
        private void UstawSkale()
        {
            wspolrzedne.skala = Siatka.Height / wspolrzedne.jakaDuzaScena;
            wspolrzedne.jakDuzeNarzedzie = wspolrzedne.jakDuzeNarzedzie * wspolrzedne.skala;
            wspolrzedne.jakDuzeNarzedzie = Math.Round(wspolrzedne.jakDuzeNarzedzie, 0, MidpointRounding.AwayFromZero);
        }

        private void utworzMacierzOdwzorowania()
        {
            odwzorowanie.MacierzOdwzorowania = new int[(int)wspolrzedne.ileKolumn, (int)wspolrzedne.ileKolumn];

            for (int i=0; i < (int)wspolrzedne.ileKolumn; i++)
            {
                for (int j = 0; j < (int)wspolrzedne.ileKolumn; j++)
                {
                    odwzorowanie.MacierzOdwzorowania[i, j] = 0;
                }
            }
        }

        private void tsbPrzeszkoda_Click(object sender, EventArgs e)
        {
           //wspolrzedne.WcisnijPrzycisk(wspolrzedne.przyciskPrzeszkodyWcisniety);

            if (wspolrzedne.przyciskPrzeszkodyWcisniety == false)
            {
                wspolrzedne.przyciskPrzeszkodyWcisniety = true;
            }
            else wspolrzedne.przyciskPrzeszkodyWcisniety = false;
        }

        private void Siatka_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            /* warunek odpowiedzialny za kolorowanie komorek na czarno. zwiazane z rysowaniem przeszkod. jezeli przycisk "Przeszkoda" jest wcisniety oraz nastepuje
             * klikniecie komorki zmienia ona swoj styl. warunek wykorzystuje metode UstawWspolrzedneXY, ktorej argumentami sa wartosci indeksow kliknietego pola.
             */
            if (wspolrzedne.przyciskPrzeszkodyWcisniety == true)
            {
                wspolrzedne.UstawWspolrzedneXY(e.ColumnIndex, e.RowIndex);
                Siatka.Rows[wspolrzedne.nrWiersza_Y].Cells[wspolrzedne.nrKolumny_X].Style.BackColor = Color.Black;
                odwzorowanie.MacierzOdwzorowania[e.ColumnIndex, e.RowIndex] = 1;
            }

            /* warunek odpowiedzialny za kolorowanie komorki na zielono. zwiazane z rysowaniem punktu startowego. jezeli przycisk "Start" jest wcisniety oraz nastepuje
             * klikniecie komorki zmienia ona swoj styl. warunek wykorzystuje metode UstawWspolrzedneXY, ktorej argumentami sa wartosci indeksow kliknietego pola.
             * Do wektora wspolrzednePunktuStartowego zapisywane sa indeksy wybranej komorki. Jezeli w polu znajduje sie wartosc -1 oznacza to, ze punkt startowy
             * nie zostal wczesniej wybrany. W wypadku wartosci roznej od -1 nastepuje wymazanie wczesniej ustawionego punktu oraz ponowne nadpisanie wektora.
             */

            if ((wspolrzedne.przyciskStartWcisniety == true) && (wspolrzedne.wspolrzednePunktuStartowego[0] == -1))
            {
                wspolrzedne.UstawWspolrzedneXY(e.ColumnIndex, e.RowIndex);
                wspolrzedne.wspolrzednePunktuStartowego[0] = wspolrzedne.nrKolumny_X;
                wspolrzedne.wspolrzednePunktuStartowego[1] = wspolrzedne.nrWiersza_Y;
                Siatka.Rows[wspolrzedne.nrWiersza_Y].Cells[wspolrzedne.nrKolumny_X].Style.BackColor = Color.Green;
                lbWysokoscPktStart.Visible = true;
                tbWysPktStart.Visible = true;
                odwzorowanie.MacierzOdwzorowania[wspolrzedne.nrKolumny_X,wspolrzedne.nrWiersza_Y] = 2;
            }

            else if ((wspolrzedne.przyciskStartWcisniety == true) && (wspolrzedne.wspolrzednePunktuStartowego[0] != -1))
            {                
                wspolrzedne.UstawWspolrzedneXY(e.ColumnIndex, e.RowIndex);
                Siatka.Rows[wspolrzedne.wspolrzednePunktuStartowego[1]].Cells[wspolrzedne.wspolrzednePunktuStartowego[0]].Style.BackColor = Color.White;
                odwzorowanie.MacierzOdwzorowania[wspolrzedne.wspolrzednePunktuStartowego[0], wspolrzedne.wspolrzednePunktuStartowego[1]] = 0;
                wspolrzedne.wspolrzednePunktuStartowego[0] = wspolrzedne.nrKolumny_X;
                wspolrzedne.wspolrzednePunktuStartowego[1] = wspolrzedne.nrWiersza_Y;
                Siatka.Rows[wspolrzedne.nrWiersza_Y].Cells[wspolrzedne.nrKolumny_X].Style.BackColor = Color.Green;
                odwzorowanie.MacierzOdwzorowania[wspolrzedne.nrKolumny_X, wspolrzedne.nrWiersza_Y] = 2;
            }

            /* warunek odpowiedzialny za kolorowanie komorki na czerwono. zwiazane z rysowaniem punktu koncowego. jezeli przycisk "Koniec" jest wcisniety oraz nastepuje
             * klikniecie komorki zmienia ona swoj styl. warunek wykorzystuje metode UstawWspolrzedneXY, ktorej argumentami sa wartosci indeksow kliknietego pola.
             * Do wektora wspolrzednePunktuKoncowego zapisywane sa indeksy wybranej komorki. Jezeli w polu znajduje sie wartosc -1 oznacza to, ze punkt koncowy
             * nie zostal wczesniej wybrany. W wypadku wartosci roznej od -1 nastepuje wymazanie wczesniej ustawionego punktu oraz ponowne nadpisanie wektora.
             */

            if ((wspolrzedne.przyciskKoniecWcisniety == true) && (wspolrzedne.wspolrzednePunktuKoncowego[0] == -1))
            {
                wspolrzedne.UstawWspolrzedneXY(e.ColumnIndex, e.RowIndex);
                wspolrzedne.wspolrzednePunktuKoncowego[0] = wspolrzedne.nrKolumny_X;
                wspolrzedne.wspolrzednePunktuKoncowego[1] = wspolrzedne.nrWiersza_Y;
                Siatka.Rows[wspolrzedne.nrWiersza_Y].Cells[wspolrzedne.nrKolumny_X].Style.BackColor = Color.Red;
                lbWysokoscPktKoniec.Visible = true;
                tbWysPktKoniec.Visible = true;
                odwzorowanie.MacierzOdwzorowania[wspolrzedne.nrKolumny_X, wspolrzedne.nrWiersza_Y] = 3;
            }

            else if ((wspolrzedne.przyciskKoniecWcisniety == true) && (wspolrzedne.wspolrzednePunktuKoncowego[0] != -1))
            {
                wspolrzedne.UstawWspolrzedneXY(e.ColumnIndex, e.RowIndex);
                Siatka.Rows[wspolrzedne.wspolrzednePunktuKoncowego[1]].Cells[wspolrzedne.wspolrzednePunktuKoncowego[0]].Style.BackColor = Color.White;
                odwzorowanie.MacierzOdwzorowania[wspolrzedne.wspolrzednePunktuStartowego[0], wspolrzedne.wspolrzednePunktuStartowego[1]] = 0;
                wspolrzedne.wspolrzednePunktuKoncowego[0] = wspolrzedne.nrKolumny_X;
                wspolrzedne.wspolrzednePunktuKoncowego[1] = wspolrzedne.nrWiersza_Y;
                Siatka.Rows[wspolrzedne.nrWiersza_Y].Cells[wspolrzedne.nrKolumny_X].Style.BackColor = Color.Red;
                odwzorowanie.MacierzOdwzorowania[wspolrzedne.nrKolumny_X, wspolrzedne.nrWiersza_Y] = 3;
            }
        }

        private void tsbStart_Click(object sender, EventArgs e)
        {
            //wspolrzedne.WcisnijPrzycisk(wspolrzedne.przyciskStartWcisniety);

            if (wspolrzedne.przyciskStartWcisniety == false)
            {
                wspolrzedne.przyciskStartWcisniety = true;
            }
            else wspolrzedne.przyciskStartWcisniety = false;
        }

        private void tsbKoniec_Click(object sender, EventArgs e)
        {
            //wspolrzedne.WcisnijPrzycisk(wspolrzedne.przyciskKoniecWcisniety);

            if (wspolrzedne.przyciskKoniecWcisniety == false)
            {
                wspolrzedne.przyciskKoniecWcisniety = true;
            }
            else wspolrzedne.przyciskKoniecWcisniety = false;
        }
    }
}